ラズパイとRAID0

2024年2月22日 追記

2024年1月25日 記

はじめに

ラズパイ5を購入して手持ちであったUSB3.2Gen2(10Gbpsなので3.1Gen2が正しいのかもしれませんが、 製品にそのように表示されているのでそのように記述することにします)のSSDを取り付けたのですが、 容量が250GBしかないのでもう少し増やしたい・・・、 更に出来ればもっと高速アクセスできるようにしたい・・・、 と思いました。でも手持ちのお金も沢山は無いので・・・というわけで妥協したところが、 USB3.2Gen2 1TB × 2 でRAID0を構成し、2TBのストレージを作ろう!ということになりました。

ちなみにUSB3.0や3.1ではなくてUSB3.2Gen2のSSDを選択した理由ですが、 価格的にUSB3.0とかのものと大差ないので、今後の事も考えてより高速転送が期待できるものとして選びました。

・・・というわけで、ここではラズパイ5とUSB SSDを2つを使用してRAID0のストレージを作ります。 なお、RAID0を構成するためのUSB SSDは同じメーカーの同じ型番の製品を新品で購入した物を用意しました。






目次

追記です
(1)ハードウェア構成
(2)デバイスファイル
(3)パーティション解放
(4)パーティション作成
(5)RAID0作成
(6)ファイルシステムを構築する
(7)SSDのデバイス名を固定する
(8)RAID0ストレージを確認
(9)RAIDデバイスのマウント
(10)最後に





2024年2月22日 追記分

追記です



左の画像はRAID0構成しているUSBハブ 2個(左上)に、 RAID0を構成しているUSB SSD 2個と起動用SSD、それとWifi6子機が付いています。

new_config.png

何の追記かと申しますと、USBハブとRAID0を構成しているUSB SSDの取り付け方を変えたらRAID0を構成する前に期待していたような結果を得られました。 ...ということです。 ラズパイ5のUSB3.0ポートはそれぞれ(同時に)5Gbpsの転送速度があることを「ふっと」思い出しまして 「パラに接続すれば速くなるんじゃね!?」とか思ってしまい、やってみたところ上手くいった感じです。

ラズパイ5のUSB3.0は仕様通りMAX 5Gbpsですが、同じUSBハブと同じケーブルを2セット用意してラズパイ5に繋ぎ、 それぞれのUSBハブの同じ位置にRAID0を構成するUSB SSDを取り付けたところ、 シーケンシャルアクセスに関しては最大1.8倍くらいのアクセス速度に達しました。

つい嬉しくなってしまい、本ページを更新することにしました。 使用したUSBハブはAmazonで購入しました。 ORICO USBハブ USB3.2 4ポート 10Gbps高速転送 セルフパワー/バスパワー両対応 50cmケーブルと変換アダプタ付き という物です。ちなみにこのUSBハブの耐久性がどれくらいかはまだ分かりません(使い始めたばかりなので...)。

もし試してみる場合には、USB3.2 Gen2 (10Gbps以上)と表示されているものをご使用ください。 また、使用するUSBハブ、USB SSD、ラズパイ5までのケーブル(とケーブル長)は同じものをご用意ください。 でないと酷い結果になるかと思います(実際、私はなりました)。 それと【しつこい】ですが、ご自身の責任で試してみてくださいね。 私は一切の責任を負いません(負えません)。


では、実行したベンチマークテストの結果です。
ご参考までに起動用SSD(仕様的にはRAID0構成しているUSB SSDと同等のもの)の結果も掲載しておきます。
旧・構成のベンチマークテスト結果

□hdparmコマンド
◆起動用ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# hdparm -tT /dev/sdb2

/dev/sdb2:
 Timing cached reads:   4470 MB in  2.00 seconds = 2235.29 MB/sec
 Timing buffered disk reads: 864 MB in  3.00 seconds = 287.87 MB/sec
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# 


◆raid0 ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# hdparm -tT /dev/md0

/dev/md0:
 Timing cached reads:   4044 MB in  2.00 seconds = 2021.90 MB/sec
 Timing buffered disk reads: 1020 MB in  3.00 seconds = 339.61 MB/sec
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# 


□diskspd
◆起動用ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# ./DiskMark-linux_local.sh ./testdata 2>&1 > ./diskspd_SG.log
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# cat ./diskspd_SG.log | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'
Read(SEQ1MQ8T1)...	357.40
Read(SEQ1MQ1T1)...	342.40
Read(RND4KQ32T1)...	58.31
Read(RND4KQ1T1)...	15.25
Write(SEQ1MQ8T1)...	237.20
Write(SEQ1MQ1T1)...	231.00
Write(RND4KQ32T1)...	26.97
Write(RND4KQ1T1)...	26.86
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# 


◆raid0 ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# ./DiskMark-linux_local.sh /media/ssd/pict/testdata 2>&1 > ./diskspd_SG.log
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# cat ./diskspd_SG.log | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'
Read(SEQ1MQ8T1)...	340.60
Read(SEQ1MQ1T1)...	322.00
Read(RND4KQ32T1)...	192.55
Read(RND4KQ1T1)...	21.55
Write(SEQ1MQ8T1)...	344.60
Write(SEQ1MQ1T1)...	350.00
Write(RND4KQ32T1)...	35.64
Write(RND4KQ1T1)...	40.91
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# 



新・構成のベンチマークテスト結果

□hdparm
◆起動用ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# hdparm -tT /dev/sdb2

/dev/sdb2:
 Timing cached reads:   4042 MB in  2.00 seconds = 2021.05 MB/sec
 Timing buffered disk reads: 902 MB in  3.00 seconds = 300.28 MB/sec
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# 


◆raid0 ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# hdparm -tT /dev/md0

/dev/md0:
 Timing cached reads:   3798 MB in  2.00 seconds = 1899.03 MB/sec
 Timing buffered disk reads: 1878 MB in  3.00 seconds = 625.43 MB/sec
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# 


□diskspd
◆起動用ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux#  ./DiskMark-linux_local.sh ./testdata 2>&1 > ./diskspd_SG.log
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# cat ./diskspd_SG.log | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'
Read(SEQ1MQ8T1)...	357.00
Read(SEQ1MQ1T1)...	342.80
Read(RND4KQ32T1)...	57.82
Read(RND4KQ1T1)...	15.25
Write(SEQ1MQ8T1)...	237.60
Write(SEQ1MQ1T1)...	232.00
Write(RND4KQ32T1)...	26.95
Write(RND4KQ1T1)...	26.63
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# 


◆raid0 ssd 
root@raspi5:/home/muroi/benchmark/diskspd-for-linux#  ./DiskMark-linux_local.sh /media/ssd/pict/testdata 2>&1 > ./diskspd_SG.log
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# cat ./diskspd_SG.log | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'
Read(SEQ1MQ8T1)...	628.60
Read(SEQ1MQ1T1)...	569.80
Read(RND4KQ32T1)...	169.22
Read(RND4KQ1T1)...	21.82
Write(SEQ1MQ8T1)...	472.00
Write(SEQ1MQ1T1)...	477.80
Write(RND4KQ32T1)...	34.28
Write(RND4KQ1T1)...	42.81
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# 


□fioコマンド (別のコマンドでは「どうか?」と思い、やってみました)
◆起動用ssd
root@raspi5:/home/muroi/benchmark/fio# fio --directory=./ fio_setting.txt --output-format=terse | awk -F ';' '{print $3, ($7+$48) / 1000 }'
SEQ1M_Q8T1_READ 367.405
SEQ1M_Q8T1_WRITE 249.72
SEQ1M_Q1T1_READ 349.758
SEQ1M_Q1T1_WRITE 236.859
RND4K_Q32T1_READ 60.224
RND4K_Q32T1_WRITE 36.434
RND4K_Q1T1_READ 16.385
RND4K_Q1T1_WRITE 25.57
root@raspi5:/home/muroi/benchmark/fio# 


◆raid0 ssd
root@raspi5:/home/muroi/benchmark/fio# fio --directory=/media/ssd/pict/ fio_setting.txt --output-format=terse | awk -F ';' '{print $3, ($7+$48) / 1000 }'
SEQ1M_Q8T1_READ 643.298
SEQ1M_Q8T1_WRITE 537.455
SEQ1M_Q1T1_READ 586.78
SEQ1M_Q1T1_WRITE 497.899
RND4K_Q32T1_READ 284.552
RND4K_Q32T1_WRITE 138.682
RND4K_Q1T1_READ 17.177
RND4K_Q1T1_WRITE 41.822
root@raspi5:/home/muroi/benchmark/fio# 



上記コマンドで使用したスクリプトと設定ファイルも掲載しておきます。

DiskMark-linux_local.sh

#! /bin/bash

# This script is derived from CrystalDiskMark
# (https://crystalmark.info/ja/software/crystaldiskmark/)

DISKSPD="diskspd"

TEST_FILE=$1
INTERVAL_TIME=5

dm_interval() {
    echo "Wait for the next test for $INTERVAL_TIME seconds..."
    sleep $INTERVAL_TIME
}

echo "Executing Sequential Read (SEQ1M Q8T1)..."

# TODO: Create test file manually for better randomization and less effect on the performance.
${DISKSPD} -c1G -Zr -b1M -d5 -o8 -t1 -W0 -Sd -w0 -L $1
dm_interval

echo "Executing Sequential Read (SEQ1M Q1T1)..."
${DISKSPD} -Zr -b1M -d5 -o1 -t1 -W0 -Sd -w0 -L $1
dm_interval

echo "Executing Random Read (RND4K Q32T1)..."
${DISKSPD} -Zr -b4K -d5 -o32 -t1 -W0 -Sd -w0 -L -r $1
dm_interval

echo "Executing Random Read (RND4K Q1T1)..."
${DISKSPD} -Zr -b4K -d5 -o1 -t1 -W0 -Sd -w0 -L -r $1
dm_interval

echo "Executing Sequential Write (SEQ1M Q8T1)..."
${DISKSPD} -Zr -b1M -d5 -o8 -t1 -W0 -Sd -w100 -L $1
dm_interval

echo "Executing Sequential Write (SEQ1M Q1T1)..."
${DISKSPD} -Zr -b1M -d5 -o1 -t1 -W0 -Sd -w100 -L $1
dm_interval

echo "Executing Random Write (RND4K Q32T1)..."
${DISKSPD} -Zr -b4K -d5 -o32 -t1 -W0 -Sd -w100 -L -r $1
dm_interval

echo "Executing Random Write (RND4K Q1T1)..."
${DISKSPD} -Zr -b4K -d5 -o1 -t1 -W0 -Sd -w100 -L -r $1
dm_interval

rm -f $TEST_FILE

echo "DiskMark is completed!"



fio_setting.txt

[global]
ioengine=libaio
size=1g
direct=1
runtime=60
stonewall

[SEQ1M_Q8T1_READ]
rw=read
bs=1m
iodepth=8
numjobs=1

[SEQ1M_Q8T1_WRITE]
rw=write
bs=1m
iodepth=8
numjobs=1

[SEQ1M_Q1T1_READ]
rw=read
bs=1m
iodepth=1
numjobs=1

[SEQ1M_Q1T1_WRITE]
rw=write
bs=1m
iodepth=1
numjobs=1

[RND4K_Q32T1_READ]
rw=randread
bs=4k
iodepth=32
numjobs=1

[RND4K_Q32T1_WRITE]
rw=randwrite
bs=4k
iodepth=32
numjobs=1

[RND4K_Q1T1_READ]
rw=randread
bs=4k
iodepth=1
numjobs=1

[RND4K_Q1T1_WRITE]
rw=randwrite
bs=4k
iodepth=1
numjobs=1


私の感想としては、結果的にはソフトウェアRAID0構成にして良かったと思います。 ハードウェアでRAID0を構成した場合だと(少なくともラズパイ5のUSB3.0ポート接続では)このような結果は期待できないと思います。 ソフトウェアRAIDなので少しCPUに負荷を掛けることになりますが、それ以上のパフォーマンスを得ることができたのではないかと思います。

なおDiskMark-linux_local.shfio_setting.txtは、 どこかのサイトに掲載されていたものを参考にさせて頂きました(いや、そのままコピーしたかもしれません)。 利用させて頂いた上に(勝手に)掲載させて頂きました。 大変助かっております。 ありがとうございました。



目次へ




(1)ハードウェア構成

最初のハードウェア構成として、 ラズパイ5のUSB3.0ポートにUSB3.0ハブ(セルフパワー)を付けてそこへ起動用SSD、 WiFi6 子機、RAID0用SSD 2個を取り付けました。

最初に結論を簡単に申し上げておきます。

上記構成だとパフォーマンスは起動用SSDに敵いませんでした。 ソフトウェアRAIDだと余計な処理が入るためです。 更にたちが悪いことに「プチフリ」も発生してしまい、とても使う気にはなれないような代物になってしまいました。 で、どうしたかと言いますととりあえずUSB3.0(バスパワー)のハブをもう1つあるポートへ接続し、 そこにRAID用のSSDだけを取り付けてみました。 すると「プチフリ」はおさまりましたがパフォーマンスは悪いままでした。 そこで次は【USB3.2Gen2のハブに取り換えれば少しは改善するかもしれない】と思いまして ダメ元でUSB3.2Gen2のハブを購入して取り付けてみました。 するとランダムアクセスのパフォーマンスが大きく向上しました(「起動用SSDと比較しても」です)。 シーケンシャルアクセスは起動用SSDより若干悪い(1割くらい)程度に収まりました。 現実的にはランダムアクセス(サイズの小さなファイルへのアクセス)の方が頻繁に発生すると思いますし、 シーケンシャルアクセスも1割程度ダウンする程度なので、 起動用SSDよりもソフトウェアRAID0構成のSSDの方が良いのでは!?と思います。 ・・・というわけで、とりあえず使い物になる状態にはなりましたので 使っていこうと思います。

ちなみに・・・ですが、安いものであれば(販売価格が)1万円前後程度でハードウェアRAIDを構成できるものが売っているようですので 「ソフトウェアRAIDに興味がある」とか 「できるだけ安くRAIDを構成したい」とかいうのでなければそちらを導入した方が賢明だと思います。 ※打ち消し線を引いた理由については、追記ですをご参照ください。




目次へ




(2)デバイスファイル

※始めに(重要です)
これからの作業をする前にRAID0を構成するSSDに番号を振るなどしてどっちのSSDかが分かるようにしておいてください。


最初はRAIDを構成するSSDを外した状態でラズパイを起動します。
起動したらデバイスファイルの情報を取得します。

$ sudo su
# ls /dev/sd*
上記 ls コマンドを実行した結果、私の環境では下記のようになりました。
# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2
/dev/sdaというのが起動用SSDのデバイスファイルです。 /dev/sda1/dev/sda2 というのが起動用SSDのパーティションのようです(ごめんなさい、私まだLinux詳しくないので・・・)。

次にRAID用のSSDを1つだけ取り付けて同コマンドを実行してみました。
# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1  /dev/sdb2
/dev/sdbというデバイスファイルが増えました。

更に続けてRAID用のSSDをもう1つ取り付けて同コマンドを実行してみました。
# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1  /dev/sdb2  /dev/sdc  /dev/sdc1  /dev/sdc2
/dev/sdcというデバイスファイルが増えました。 Linuxの場合、ストレージのデバイスファイルは/dev/sd? ?は、 aから認識した順にb,c,・・・となるようです。

ただ注意しなければならないことが1つあります。 それはハードウェア構成が変わらなくてもLinuxは【起動するたびにデバイスを認識する順番が異なることがある】ということです。 つまり今回は/dev/sdbが(仮に)1番のSSDだったとしても、 次回起動したときには/dev/sdb2番のSSDになっていることがある、ということです。




目次へ




(3)パーティション解放

私が購入したSSDはパーティションが2つありまして、最初に解放する必要がありました。
(すでにパーティションを解放してあるSSDをご使用の場合には、この項目を読み飛ばしてください。)

パーティションの解放(フォーマットも)は fdisk コマンドで行います。 fdisk コマンドに対象となるデバイスのデバイスファイルを指定します。

# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.
続いて【p】コマンドを実行して現在のパーティションを確認します。
Command (m for help): p

Disk /dev/sdb: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: SSPS-US
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: D6F632E7-C388-4F75-A02B-06C1E1ACE28E

Device     Start        End    Sectors   Size Type
/dev/sdb1     34      32767      32734    16M Microsoft reserved
/dev/sdb2  32768 1953523711 1953490944 931.5G Microsoft basic data

Partition 1 does not start on physical sector boundary.

(下記のように) パーティションを解放するため【d】コマンドを入力します。
(パーティションが2つあるので)2番(defaultとなっている方)を指定して(defaultが2番となっているので単にEnterキーを押すだけでも大丈夫だと思います)解放します。
続けてもう1度【d】コマンドを実行しました。
Command (m for help): d
Partition number (1,2, default 2): 2

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help):
上記の操作をもう1つあるSSD(/dev/sdc)にも行います。

パーティションを解放したらシャットダウンして電源をOFFにした後、
RAID0を構成するSSDを一旦外してから 起動(電源ON)してください。
# shutdown now

再起動後SSDを1つずつ取り付けて対応するデバイスファイルを確認してください。




目次へ




(4)パーティション作成

(3)でパーティションを解放したら、改めてパーティションを確保&フォーマットを行います。 流れとしては下記のようになります。


  1. 【n】コマンドでパーティションを確保します。
  2. 【t】コマンドでパーティションタイプを設定します。
  3. 【w】コマンドでパーティションテーブルを書き込みます。



では、パーティション確保&フォーマットをしましょう。

※ここでは2つあるSSDのうち(仮に)1番のSSDを /dev/sdb、2番のSSDを /dev/sdc として話を進めます。
 ご自身の環境に合わせて適切に変えてください



sudo sufdisk /dev/sdb を実行して、続けて fdisk の【n】コマンドを実行します。
パーティション番号を聞かれるので、デフォルトの 1 を入力します。
以降、2つ 質問されますがデフォルトで大丈夫(赤色の部分の数値が両方のSSDで同じ値であることを確認してください)ですので Enter キーを押しましょう。

上手くいけば(下記のように)新しいパーティションが作成されます。

# sudo su
# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.

Command (m for help): n
Partition number (1-128, default 1): 1
First sector (34-1953525134, default 2048):	← コレ!
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1953525134, default 1953523711):	← コレ!

Created a new partition 1 of type 'Linux filesystem' and of size 931.5 GiB.

Command (m for help):



下の t コマンドを実行している様子の部分を参照しながらご覧ください)。

続いて【t】コマンドを実行してパーティションタイプをRAIDに設定します。
とりあえず(下のように)【t】コマンドを実行してみてください。
すると「パーティションタイプ」の一覧が表示されます。

42番にRAIDのパーティションタイプがありました。
(下には42番は含まれていません。ごめんなさい、飛ばしてしまいました)。

で、入力する必要があるのは【42番】という番号ではなくて、右側に表示されている【記号】です。
  Partition type or alias (type L to list all):
のところに(下記のように)【記号】を入力(コピペ)してEnterキーを押してください。

Command (m for help):t

	・・・・
167 Solaris reserved 5             6A8D2AC7-1DD2-11B2-99A6-080020736631
168 NetBSD swap                    49F48D32-B10E-11DC-B99B-0019D1879648
169 NetBSD FFS                     49F48D5A-B10E-11DC-B99B-0019D1879648
170 NetBSD LFS                     49F48D82-B10E-11DC-B99B-0019D1879648
171 NetBSD concatenated            2DB519C4-B10F-11DC-B99B-0019D1879648
172 NetBSD encrypted               2DB519EC-B10F-11DC-B99B-0019D1879648
173 NetBSD RAID                    49F48DAA-B10E-11DC-B99B-0019D1879648
174 ChromeOS kernel                FE3A2A5D-4F32-41A7-B725-ACCC3285A309
175 ChromeOS root fs               3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC
176 ChromeOS reserved              2E0A753D-9E48-43B0-8337-B15192CB1B5E
177 MidnightBSD data               85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7
178 MidnightBSD boot               85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7
179 MidnightBSD swap               85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7
180 MidnightBSD UFS                0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7
181 MidnightBSD ZFS                85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7
182 MidnightBSD Vinum              85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7
183 Ceph Journal                   45B0969E-9B03-4F30-B4C6-B4B80CEFF106
184 Ceph Encrypted Journal         45B0969E-9B03-4F30-B4C6-5EC00CEFF106
185 Ceph OSD                       4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D
186 Ceph crypt OSD                 4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D
187 Ceph disk in creation          89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE
188 Ceph crypt disk in creation    89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE
189 VMware VMFS                    AA31E02A-400F-11DB-9590-000C2911D1B8
190 VMware Diagnostic              9D275380-40AD-11DB-BF97-000C2911D1B8
191 VMware Virtual SAN             381CFCCC-7288-11E0-92EE-000C2911D0B2
192 VMware Virsto                  77719A0C-A4A0-11E3-A47E-000C29745A24
193 VMware Reserved                9198EFFC-31C0-11DB-8F78-000C2911D1B8
194 OpenBSD data                   824CC7A0-36A8-11E3-890A-952519AD3F61
195 QNX6 file system               CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1
196 Plan 9 partition               C91818F9-8025-47AF-89D2-F030D7000C2C
197 HiFive FSBL                    5B193300-FC78-40CD-8002-E86C45580B47
198 HiFive BBL                     2E54B353-1271-4842-806F-E436D6AF6985
199 Haiku BFS                      42465331-3BA3-10F1-802A-4861696B7521
200 Marvell Armada 3700 Boot partition 6828311A-BA55-42A4-BCDE-A89BB5EDECAE

Aliases:
   linux          - 0FC63DAF-8483-4772-8E79-3D69D8477DE4
   swap           - 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
   home           - 933AC7E1-2EB4-4F13-B844-0E14E2AEF915
   uefi           - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
   raid           - A19D880F-05FC-4D3B-A006-743F0F84911E	← 42番のLinux RAIDと同じ!
   lvm            - E6D6D379-F507-44C2-A23C-238F2A3DF928

Partition type or alias (type L to list all):A19D880F-05FC-4D3B-A006-743F0F84911ERAIDの【記号】を入力!
Changed type of partition 'Linux RAID' to 'Linux RAID'.	← (私が)2度実行してしまったので 'Linux RAID' to 'Linux RAID' になっています!

Command (m for help):



【w】コマンドを実行してパーティションタイプテーブルを書き込みます。

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

上記のようになればOKです。
これをもうひとつのSSDにも同様に実行してパーティションを作成します。




目次へ




(5))RAID0作成

※以下の作業を始める前に、一度シャットダウンして/dev/sdbが1番のSSD、/dev/sdcが2番のSSDになるようにしました。 ちなみに/dev/sdaは(無関係の)起動用SSD(256GB)です。また、以下の作業をする前に【再起動】する必要があるようです!

・・・というわけで、一旦シャットダウン(電源OFF)してSSDを外し、起動(電源ON)してください。

# shutdown now


デバイスファイルは下のようになっているものとして以降、話を進めます。 ご自身の環境に合わせて適切に読み替えてください。

$ sudo su
# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1  /dev/sdc  /dev/sdc1
     ・・・
  /dev/sda ← 起動用SSD
  /dev/sdb ← 1番のSSD
  /dev/sdc ← 2番のSSD


ソフトウェアRAIDの mdadm をインストールします。

# apt install mdadm


続けて下記コマンドを実行して RAID0 ストレージを作成します。

# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1

ちなみに RAID1 を作成したいときは --level=1 にすればOKです。


コマンドを実行した結果は下記のようになります。

# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.


RAIDストレージが作られたかを確認します。

# cat /proc/mdstat


上記コマンドを実行して下記のような感じになっていればOKです。

# cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sdc1[1] sdb1[0]
      1953257472 blocks super 1.2 512k chunks

unused devices: 


md0 が作成されているのを確認した後に、/etc/mdadm/mdadm.conf に設定情報を書き込みます。
(mdadm --create で作成された情報は再起動すると消えてしまいます。)

# mdadm --detail --scan >> /etc/mdadm/mdadm.conf


上記コマンドの実行結果を確認します。

# cat /etc/mdadm/mdadm.conf


上記コマンドを実行して、(ファイルの)最後に下記のような1行があれば大丈夫のようです。
なお、【ホスト名(ここではraspi5)】が入っているので、今後【ホスト名】は変更しない方が良いのかもしれません。

ARRAY /dev/md0 metadata=1.2 name=raspi5:0 UUID=978e955f:72133f5f:fd8ef3d4:659de231




目次へ




(6)ファイルシステムを構築する

作成したRAIDデバイス /dev/md0 に対してLinuxファイルシステムを構築します。
下記コマンドを実行して ext4 フォーマットを施します。

# mkfs -t ext4 /dev/md0


上記コマンドを実行した結果です。

# mkfs -t ext4 /dev/md0
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 488314368 4k blocks and 122085376 inodes
Filesystem UUID: 6cadc340-5d5f-4134-a726-7dc60a292256
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done




目次へ




(7)USB SSDのデバイス名を固定する

USB SSDのデバイス名は認識された順に /dev/sda, /dev/sdb と自動で割り当てられてしまうため、 Raspberry Piを再起動した後に RAID が崩れる危険性があります。 そのため、各SSDデバイス名を固定するようにします。

USB SSDのデバイス情報を取得します。
udevadmコマンドでUSB SSDのデバイス情報を取得します。

まずは1番のUSB SSD情報を取得します。

# udevadm info -a -n /dev/sdb

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at parent device '/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb4/4-1/4-1.3':
    KERNELS=="4-1.3"
    SUBSYSTEMS=="usb"		← "usb"のところをご覧ください
    DRIVERS=="usb"
    ATTRS{authorized}=="1"

	~~ 省略 ~~

    ATTRS{product}=="I-O DATA SSPS-US"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{remove}=="(not readable)"
    ATTRS{rx_lanes}=="1"
    ATTRS{serial}=="234120019532"

	~~ 省略 ~~

●1番のUSB SSDの情報
  ATTRS{product}=="I-O DATA SSPS-US"
  ATTRS{serial}=="234120019532"

同様にして、2番のUSB SSDの情報も取得してください。

●2番のUSB SSDの情報
  ATTRS{product}=="I-O DATA SSPS-US"
  ATTRS{serial}=="234120009786"

シリアル番号 ATTRS{serial} と製品名 ATTRS{product} を組み合わせれば、 それぞれのUSB SSDを一意に特定できそうです。

・・・というわけで、 USB SSDのデバイス名の割り当てですが、

  1番のUSB SSD → /dev/raid_01_001
  2番のUSB SSD → /dev/raid_01_002

に割り当てるように、ファイル
/etc/udev/rules.d/mdadmcheck.sh と、
/etc/udev/rules.d/10-local.rules を作成します。

# vi /etc/udev/rules.d/mdadmcheck.sh


mdadmcheck.sh

#!/bin/bash

if [ $# -ne 2 ]; then
        echo "Argument Error $#" 1&2

        exit 1
fi

DEVICE_COUNT=`ls $(echo $1) | wc -l`

echo $DEVICE_COUNT

if [[ ${DEVICE_COUNT} -eq $2 ]]; then
        echo 'OK'
        mdadm --assemble --scan
fi

exit 0

下記コマンドを実行して作成したファイル(スクリプト)に実行権限を付けます。

# chmod a+x /etc/udev/rules.d/mdadmcheck.sh



続いて /etc/udev/rules.d/10-local.rules を作成します。

# vi /etc/udev/rules.d/10-local.rules


/etc/udev/rules.d/10-local.rules

ACTION=="add" SUBSYSTEMS=="usb", ATTRS{product}=="I-O DATA SSPS-US", ATTRS{serial}=="234120019532", SYMLINK="raid_01_001%n" RUN+="/etc/udev/rules.d/mdadmcheck.sh '/dev/raid_01_00[1234]1' 4"
ACTION=="add" SUBSYSTEMS=="usb", ATTRS{product}=="I-O DATA SSPS-US", ATTRS{serial}=="234120009786", SYMLINK="raid_01_002%n" RUN+="/etc/udev/rules.d/mdadmcheck.sh '/dev/raid_01_00[1234]1' 4"


ファイルを作成し終わったら再起動します。

# reboot




目次へ




(8)RAID0ストレージを確認

下記コマンドを事項して確認します。

$ ls -l /dev/raid*


実際に実行した結果が下記です。

 $ ls -l /dev/raid*
lrwxrwxrwx 1 root root  3  1月 17 20:23 /dev/raid_01_001 -> sda
lrwxrwxrwx 1 root root  3  1月 17 20:23 /dev/raid_01_0010 -> sg0
lrwxrwxrwx 1 root root  4  1月 17 20:23 /dev/raid_01_0011 -> sda1
lrwxrwxrwx 1 root root  3  1月 17 20:23 /dev/raid_01_002 -> sdb
lrwxrwxrwx 1 root root 11  1月 17 20:23 /dev/raid_01_0020 -> bsg/1:0:0:0
lrwxrwxrwx 1 root root  4  1月 17 20:23 /dev/raid_01_0021 -> sdb1
lrwxrwxrwx 1 root root 15  1月 17 20:23 /dev/raid_01_0022 -> bus/usb/002/004


下記コマンドで、もう一度確認します。

 $ sudo su
# cat /proc/mdstat
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md127 : active raid0 sdb1[1] sda1[0]
      1953257472 blocks super 1.2 512k chunks

unused devices: 


ここで注意が必要です。
md0 としていたデバイスファイルが md127 に変わってしまいました!!!
次の作業で md? (md127) を使いますので、ご自分の環境のものを確認しておいてください!




目次へ




(9)RAIDデバイスのマウント

下記コマンドを実行して uuid を確認します。(md127 は実際にいくつになったかは cat /proc/mdstat を実行して確認してください。)

# ls -l /dev/disk/by-uuid/* | grep md127


実行結果です。
【赤い部分】が uuid (環境等により変わります)です。

# ls -l /dev/disk/by-uuid/* | grep md127
lrwxrwxrwx 1 root root 11  1月 17 20:23 /dev/disk/by-uuid/6cadc340-5d5f-4134-a726-7dc60a292256 -> ../../md127


RAIDデバイスをマウントするために、md127 が割り当てられている uuid/etc/fstab に追記します。
なお、ここでマウントポイントは /media/ssd としますが、任意に変更して頂いて大丈夫です。 変更した場合には以降のマウントポイントは変更したものに置き換えてください。

# echo 'UUID=********-****-****-****-************ /media/ssd ext4 nofail 0 2' >> /etc/fstab


/etc/fstab に下記のような行が追加されていればOKです。

UUID=********-****-****-****-************ /media/ssd ext4 nofail 0 2


マウントポイント(ここでは /media/ssd ディレクトリ)を作ります。

# cd /media
# mkdir ssd
# chmod 777 ssd


マウントしてみます。

# mount /media/ssd


エラーが無ければマウントされていると思いますが、 私の環境で実行したら下記のように表示されてしまいました。 そのため表示の通り systemctl daemon-reload を実行したところ、 問題なく終了しました。

(続けて) df コマンドでマウントされているかを確認してみましょう。

# mount /media/ssd
mount: (hint) your fstab has been modified, but systemd still uses
       the old version; use 'systemctl daemon-reload' to reload.
# systemctl daemon-reload
# df -h


下記のような感じで /dev/md127/media/ssd にマウントされていれば完了です。

# df -h
ファイルシス                                 サイズ  使用  残り 使用% マウント位置
udev                                           3.8G     0  3.8G    0% /dev
tmpfs                                          805M  8.3M  797M    2% /run
/dev/sdc2                                      235G   65G  159G   29% /
tmpfs                                          4.0G  560K  4.0G    1% /dev/shm
tmpfs                                          5.0M   48K  5.0M    1% /run/lock
/dev/sdc1                                      510M   74M  437M   15% /boot/firmware
tmpfs                                          805M  208K  805M    1% /run/user/1000
/dev/md127                                     1.8T   28K  1.7T    1% /media/ssd




目次へ




(10)最後に

考えていた通りのパフォーマンスが出ているか、きちんと確認することをお勧めします。 環境により単体のUSB SSDよりパフォーマンスが悪いこともありえますので・・・。

いくつかのベンチマークソフトの名前を列挙しておきます。
使い方は・・・ググってみてくださいね。

  1. hdparm
  2. diskspd
  3. dd
  4. fio

以上です。




目次へ






メニュー